/*
 * Conn.h
 *
 *   Created on: 2010-2-11     
 *  Description: 描述了一个Client与Server的一次rpc过程调用
 *    Copyright: 2010 @ ICT Li Heyuan
 */

#ifndef CONN_H_
#define CONN_H_

#include "../net/Network.h"

#include "../json_cpp/reader.h"
#include "../json_cpp/writer.h"
#include "../json_cpp/value.h"
using Json::Reader;
using Json::FastWriter;
using Json::Value;

#include <string>
using std::string;

class Server;

class Conn
{
public:
	/* 构造函数
	 * @param server TcpServer的引用
	 * @param sock socket的fd
	 */
	Conn(Server* server, int sock, const EasyAddr &addr) :
		_server(server), _addr(addr), _sock(sock)
	{
	}

	/* 析构函数，关闭sock
	 */
	virtual ~Conn()
	{
		::close(_sock);
	}

	/* 根据sock的Event和Stage转向对应操作
	 * @param event 事件类型
	 * @return 一次处理的事件是否成功？
	 */
	virtual bool handle(unsigned int event) = 0;

	/* 测试是否eof
	 * @return 已经eof返回true，否则返回false
	 */
	virtual bool isEOF()
	{
		std::string tmp;
		bool eof = false;
		if (!Network::recvBytes(_sock, tmp, eof, 0))
		{
			return true;
		}
		return eof;
	}

	//JobPoll可以访问所有私有成员
	friend class JobPoll;

protected:

	/**
	 * 调用rpcServer的Method
	 * @param error 返回的错误
	 * @return 如果method逻辑执行成功返回true否则false
	 */
	bool callMethod(string &error);

protected:
	//TcpServer的引用
	Server* _server;

	//Conn的地址信息
	EasyAddr _addr;

	//sock的fd
	int _sock;

	//Json的reader和writer
	Reader _jsonReader;
	FastWriter _jsonWriter;

	//request数据的JsonObject
	Value _jsonReq;

	//response的JsonObject
	Value _jsonResp;

	//执行中发生的错误
	string _error;
};

#endif /* CONN_H_ */
